转:C 语言已死?

今天俗一把,掺乎近期网上最热门的这个话题:C语言已经死了,5个需要忘却它的理由。大家驳来驳去的。这的确是一个不值得一驳的问题,我这里也没打算驳斥那些观点。只是写点别的:

C 并不是对机器模型的完整抽象,就是说把 C 作为一种 portable assembly language 是有缺陷的。即使是做底层,光有 C 也是不够的 (IMHO) 。

C 语言的卫道者们最喜欢举的一个例子是:某某语言的 VM 都是用 C 的;或是某某语言都是先编译成 C 再编译成本地码等等,以示 C 的重要性。没错,现今的事实如此,这是历史选择的结果。我最近在读一本翻译的很糟糕的书,《游戏——自然规律支配偶然性》 。如果有人耐着性子读下去,就可以从书中列举的小球游戏看到选择一般怎样发生。

今天看来 C 并不太适合写 VM ,也非做别的语言编译成本地代码的中间语言之最佳选择(尤其对函数式语言来说)。选择 C 只是没有更好的选择而已。

我最近读了一些关于C–的paper ,C 对 gc 支持的不足可以说是最大的一个缺陷。这一点是语言的不足,用库去解决是不太现实的了。对于函数式语言来说,函数尾调用的堆栈优化也使 C 在性能表现上相形见绌。到了 C++ 解决了一些,不仅外观是拙劣的(大量的 inline 函数的使用),性能依然有欠缺。可悲的是,许多 C 程序员对这些不屑一顾(尤其是对 gc 的错误认识)。

其实即使是机器语言上的编程,到了具体流行的系统上,也有强烈的历史选择的痕迹。比如堆栈的设计,对于冯诺体系来说并不是必须。但是大家都这么设计了,CPU 也按这个做了优化(提供堆栈寄存器、优化堆栈指令的速度),导致了最终我们都得选择这种结果。别的设计并非不存在,比如 forth 语言就依赖双堆栈来工作。btw ,forth 这种小语言,至今也未能消失。它的大量使用甚至鲜为人知。比如在 boot firmware 领域的地位就无可取代。

C 在静态语言中没有太大的竞争者其实也是 C 的悲哀。造成了在 C 能力临界点上的领域,它依旧成了最好的选择。这造成了大家在低阶开发上把 C 当万能药来使。今天看来,没有 C 是万万不能的,这也是一个历史选择的结果。假若当年 pascal 战胜了 C ,现今所有用 C 写的代码都用 pascal 来实现也未尝不可。

C 在历史的选择中走到了今天,当然还会一直存在下去。
<完>

原文地址:http://blog.codingnow.com/2007/01/is_c_dead.html